memcpy · memmove · memcmp

您所在的位置:网站首页 strcpy strncpy memcpy memcpy · memmove · memcmp

memcpy · memmove · memcmp

#memcpy · memmove · memcmp | 来源: 网络整理| 查看: 265

在这里插入图片描述 啊我摔倒了..有没有人扶我起来学习....

👱个人主页: 《 C G o d 的个人主页》 \color{Darkorange}{《CGod的个人主页》} 《CGod的个人主页》交个朋友叭~ 💒个人社区: 《编程成神技术交流社区》 \color{Darkorange}{《编程成神技术交流社区》} 《编程成神技术交流社区》加入我们,一起高效学习,收割好Offer叭~ 🌱刷题链接: 《 L e e t C o d e 》 \color{Darkorange}{《LeetCode》} 《LeetCode》快速成长的渠道哦~

目录 前言一、memcpy1.1 memcpy使用场景1.2 memcpy模拟实现 二、memmove2.1 memmove使用场景2.2 memmove模拟实现 三、memcmp3.1 memcmp使用场景

前言 C语言中对字符和字符串的处理很是频繁,但是C语言本身是没有字符串类型的,字符串通常放在常量字符串中或者字符数组中字符串常量适用于那些对它不做修改的字符串函数 一、memcpy 1.1 memcpy使用场景 void * memcpy ( void * destination, const void * source, size_t num ); 函数memcpy从source的位置开始向后复制num个字节的数据到destination的内存位置。这个函数在遇到 '\0'的时候并不会停下来。如果source和destination有任何的重叠,复制的结果都是未定义的 #include #include struct { char name[40]; int age; } person, person_copy; int main() { char myname[] = "Pierre de Fermat"; /* using memcpy to copy string: */ memcpy(person.name, myname, strlen(myname) + 1); person.age = 46; /* using memcpy to copy structure: */ memcpy(&person_copy, &person, sizeof(person)); printf("person_copy: %s, %d \n", person_copy.name, person_copy.age); return 0; }

输出结果:在这里插入图片描述

1.2 memcpy模拟实现

参考代码:

void* memcpy(void* dst, const void* src, size_t count) { void* ret = dst; assert(dst); assert(src); /* * copy from lower addresses to higher addresses */ while (count--) { *(char*)dst = *(char*)src; dst = (char*)dst + 1; src = (char*)src + 1; } return(ret); } 二、memmove 2.1 memmove使用场景 void * memmove ( void * destination, const void * source, size_t num ); 和memcpy的差别就是memmove函数处理的源内存块和目标内存块是可以重叠的如果源空间和目标空间出现重叠,就得使用memmove函数处理 #include #include int main() { char str[] = "memmove can be very useful......"; memmove(str + 20, str + 15, 11); puts(str); return 0; }

输出结果:在这里插入图片描述

2.2 memmove模拟实现

参考代码:

void* memmove(void* dst, const void* src, size_t count) { void* ret = dst; if (dst = ((char*)src + count)) { /* * Non-Overlapping Buffers * copy from lower addresses to higher addresses */ while (count--) { *(char*)dst = *(char*)src; dst = (char*)dst + 1; src = (char*)src + 1; } } else { /* * Overlapping Buffers * copy from higher addresses to lower addresses */ dst = (char*)dst + count - 1; src = (char*)src + count - 1; while (count--) { *(char*)dst = *(char*)src; dst = (char*)dst - 1; src = (char*)src - 1; } } return(ret); } 三、memcmp 3.1 memcmp使用场景 int memcmp ( const void * ptr1, const void * ptr2, size_t num ); 比较从ptr1和ptr2指针开始的num个字节返回值如下: 在这里插入图片描述 #include #include int main() { char buffer1[] = "DWgaOtP12df0"; char buffer2[] = "DWGAOTP12DF0"; int n; n = memcmp(buffer1, buffer2, sizeof(buffer1)); if (n > 0) printf("'%s' is greater than '%s'.\n", buffer1, buffer2); else if (n


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3